/**
 *  Server SDK
 * 说明：
 * 以下代码只是为了方便商户测试而提供的样例代码，商户可根据自己网站需求按照技术文档编写, 并非一定要使用该代码。
 * 接入支付流程参考开发者中心：https://www..com/docs/server/charge ，文档可筛选后端语言和接入渠道。
 * 该代码仅供学习和研究  SDK 使用，仅供参考。
 */
package com.kehanpay.sdk.example;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import com.kehanpay.sdk.Kehan;
import com.kehanpay.sdk.exception.APIConnectionException;
import com.kehanpay.sdk.exception.APIException;
import com.kehanpay.sdk.exception.AuthenticationException;
import com.kehanpay.sdk.exception.ChannelException;
import com.kehanpay.sdk.exception.InvalidRequestException;
import com.kehanpay.sdk.exception.KehanException;
import com.kehanpay.sdk.model.Charge;
import com.kehanpay.sdk.model.ChargeCollection;

/**
 * Charge 对象相关示例
 *
 * 该实例程序演示了如何从  服务器获得 charge，查询 charge。
 *
 * 开发者需要填写 apiKey 和 appId。
 *
 */
public class ChargeExample {

	private String appId;

    ChargeExample(String appId) {
        this.appId = appId;
    }

    public static void runDemos(String appId) {
    	
    	System.out.println(Kehan.apiKey);
    	System.out.println(Kehan.privateKeyPath);

        ChargeExample chargeExample = new ChargeExample(appId);
        
        //=========微信支付==weixinpay=======================
        /*
        System.out.println("-----微信app支付demo---------");
        Charge chargewx_app = chargeExample.createCharge4wx_app();
        */
        
        
        System.out.println("-----微信二维码支付demo---------");
        Charge chargewx_pub_qr = chargeExample.createCharge4wx_pub_qr();
        
        
        /*
        System.out.println("-----微信公众号支付demo---------");
        String openid = "oYT1TxCPHx0XjxBe6EmGOJ2P1S8I";
        Charge chargewx_pub = chargeExample.createChargeWithOpenid(openid);
        */
        
        //=========支付宝支付==alipay=======================
        /*
        System.out.println("-----支付宝扫码支付--------");
        Charge chargealipay_qr = chargeExample.createCharge4alipay_qr();
        */
        
        /*
        System.out.println("-----支付宝js（服务窗）支付 ------");
        Charge chargecnbc_alipay_jspay = chargeExample.createCharge4alipay_service_jspay();
        */
        
        //=========统一小额支付（商家扫用户支付条码）=======================
        /*
        System.out.println("-----统一小额支付，是基于微信，手机 qq，支付宝钱包客户端提供的支付服务功能----");
        Charge chargealipay_jspay = chargeExample.createCharge4unified_trade_micropay();
        */
        /**
         * 冲正:
         *    即一笔交易在终端已经置为成功标志，但是发送到主机的账务交易包没有得到响应
         * ，即终端交易超时，所以不确定该笔交易是否在主机端也成功完成，为了确保用户的利益，
         * 终端重新向主机发送请求，请求取消该笔交易的流水，如果主机端已经交易成功，则回滚交易，
         * 否则不处理，然后将处理结果返回给终端。
		 * 	冲正，就为系统认为可能交易失败时采取的补救手法。
		 * 
		 * 银联卡在银联POS机上刷卡交易时出现“冲正成功”和“冲正不成功”的故障提示：
		 *	1、“ 冲正成功，请重新缴费”：此项交易金成功冲正退回，需要重新刷卡交易 。
		 *	2、“ 冲正不成功，请人工处理”：此项交易属于错误操作，（银联POS机与银联结算中心在数据传输过程中发生故障造成），
		 *	但交易发起方的账户已被划拨扣款，交易发起方需要重新刷卡交易。
		 *	这笔错误交易事后由银联工作人员到POS机商户处填写“同意退款单”并加盖POS商户公章，交易人工冲正成功。
         * */
        //System.out.println("-----统一小额支付，冲正接口----");
        
        
        //=========QQ钱包（扫码、公众号）=======================
        /*
        System.out.println("-----手QQ扫码支付---可用于扫码、公众号、H5 3种支付---");
        Charge chargeqqpay_qr = chargeExample.createCharge4qqpay_qr();
        */
        /*
        System.out.println("-----手QQ公众号支付------");
        Charge chargeqqpay_jspay = chargeExample.createCharge4qqpay_jspay();
        */
//        System.out.println("-----手QQ钱包H5支付 -【目前支付类型进件里没有这个通道】------");
//        Charge chargeqqpay_wappay = chargeExample.createCharge4qqpay_wappay();
        
        //==========查询========================================
        /*
        System.out.println("-----根据kehanpay平台 chargeId查询 charge -------");
        String chargeId = "ch_894512607153623040";
        //chargeId = chargealipay_jspay.getId();
        chargeExample.retrieve(chargeId);
        */
        
    }
    
    /**
     * 创建 kehanpay Charge
     *
     * 创建 Charge 用户需要组装一个 map 对象作为参数传递给 Charge.create();
     * map 里面参数的具体说明请参考：https://.com/document/api#api-c-new
     * @return Charge
     */
    public Charge createCharge4EhkingSCANCODE_WEIXIN_PAY_P2P() {
        Charge charge = null;
        Map<String, Object> chargeMap = new HashMap<String, Object>();
        
        Map<String, String> app = new HashMap<String, String>();
        
        //kehanpay分配商户号
        app.put("id", appId);//由 Kehanpay 生成的支付对象 ID， 27 位字符串。
        chargeMap.put("app", app);
        chargeMap.put("channel", "SCANCODE-WEIXIN_PAY-P2P");//支付使用的第三方支付渠道。参考 支付渠道属性值 。
        String orderNo = new Date().getTime() + Main.randomString(7);//demo 订单号 自定义
        //orderNo = "14809598473727bvncff";
        chargeMap.put("order_no", orderNo);//商户订单号，适配每个渠道对此参数的要求，必须在商户系统内唯一。( alipay : 1-64 位，  wx : 2-32 位， bfb : 1-20 位， upacp : 8-40 位， yeepay_wap :1-50 位， jdpay_wap :1-30 位， cnp_u :8-20 位， cnp_f :8-20 位， qpay :1-30 位， cmb_wallet :10 位纯数字字符串。注：除 cmb_wallet 外的其他渠道推荐使用 8-20 位，要求数字或字母，不允许特殊字符)。
        chargeMap.put("amount", "1");//订单总金额（必须大于0），单位为对应币种的最小货币单位，人民币为分。如订单总金额为 1 元， amount 为 100，么么贷商户请查看申请的借贷金额范围。
        chargeMap.put("currency", "cny");//三位 ISO 货币代码，目前仅支持人民币  cny 。
        chargeMap.put("subject", "Your Subject");//商品的标题，该参数最长为 32 个 Unicode 字符，银联全渠道（ upacp / upacp_wap ）限制在 32 个字节。
        chargeMap.put("body", "Your Body");//商品的描述信息，该参数最长为 128 个 Unicode 字符，yeepay_wap 对于该参数长度限制为 100 个 Unicode 字符。
        chargeMap.put("client_ip", "127.0.0.1");// 发起支付请求客户端的 IP 地址，格式为 IPV4，如: 127.0.0.1

        /**notify_url
         * 接收kehanpay通知的 URL，需给绝对路径，255字 符 内 格 式
			如:http://wap.tenpay.com/tenpay.jsp，确保威富通能通过互联网访问该地址
         * */
        chargeMap.put("notify_url", "http://www.test.com/notifyurl");
        
        Map<String, Object> extra = new HashMap<String, Object>();//特定渠道发起交易时需要的额外参数，以及部分渠道支付成功返回的额外参数，详细参考 支付渠道 extra 参数说明 。
        
        String products = "[{'name':'apple','quantity':'1','amount':'1','receiver':'易汇金','description':'苹果'}]";
        extra.put("products", products);
        chargeMap.put("extra", extra);
        try {
            //发起交易请求
            charge = Charge.create(chargeMap);
            // 传到客户端请先转成字符串 .toString(), 调该方法，会自动转成正确的 JSON 字符串
            String chargeString = charge.toString();
            System.out.println(chargeString);
        } catch (KehanException e) {
            e.printStackTrace();
        }
        return charge;
    }
    
    /**
     * 创建 Charge (中信支付宝js（服务窗）支付)
     *
     * 创建 Charge 用户需要组装一个 map 对象作为参数传递给 Charge.create();
     * map 里面参数的具体说明请参考：https://.com/document/api#api-c-new
     * @return Charge
     */
    public  Charge createCharge4alipay_service_jspay() {
    	Charge charge = null;
    	Map<String, Object> chargeMap = new HashMap<String, Object>();
    	
    	Map<String, String> app = new HashMap<String, String>();
    	
    	/**由 Kehanpay 生成的支付对象 ID， 27 位字符串。*/
    	app.put("id", appId);
    	chargeMap.put("app", app);
    	
    	/**支付使用的第三方支付渠道。参考 支付渠道属性值 。*/
    	chargeMap.put("channel", "alipay_service_jspay");
    	
    	/**demo 订单号 自定义*/
    	String orderNo = new Date().getTime() + Main.randomString(7);
    	
    	/**商户订单号，适配每个渠道对此参数的要求，必须在商户系统内唯一*/
    	chargeMap.put("order_no", orderNo);
    	
    	/**订单总金额（必须大于0），单位为对应币种的最小货币单位，人民币为分。如订单总金额为 1 元， amount 为 100，么么贷商户请查看申请的借贷金额范围。*/
    	chargeMap.put("amount", "1");
    	
    	/**三位 ISO 货币代码，目前仅支持人民币  cny 。*/
    	chargeMap.put("currency", "cny");
    	
    	/**商品的标题，该参数最长为 32 个 字符。*/
    	chargeMap.put("subject", "商品的标题 支付宝js（服务窗）支付测试");
    	
    	/**商品的描述信息，该参数最长为 128 个 字符。*/
    	chargeMap.put("body", "商品的描述信息 支付宝js（服务窗）支付测试");
    	
    	/**发起支付请求客户端的 IP 地址，格式为 IPV4，如: 127.0.0.1*/
    	chargeMap.put("client_ip", "127.0.0.1");
    	
    	/**
         * 订单失效时间，用Unix时间戳表示。时间范围在订单创建后的1分钟到15天，默认为1天，创建时间以支付服务器时间为准。
         * 微信对该参数的有效值限制为2小时内；银联对该参数的有效值限制为1小时内。格式为 yyyyMMddHHmmss，
         * 如2009 年 12 月 27 日 9 点 10 分 10 秒表示为20091227091010。时区为 GMT+8 beijing。
         * */
        chargeMap.put("time_expire", "");
    	
    	/**买家支付宝账号,和 buyer_ id 不能同时为空*/
    	chargeMap.put("buyer_logon_id", "1045997387@qq.com");
    	
    	/**买家的支付宝用户 ID,和 buyer_logon_id不能同时为空*/
    	chargeMap.put("buyer_id", "");
    	
    	/**特定渠道发起交易时需要的额外参数，以及部分渠道支付成功返回的额外参数，详细参考 支付渠道 extra 参数说明 。*/
    	Map<String, Object> extra = new HashMap<String, Object>();//
    	/**notify_url
    	 * 接收kehanpay通知的 URL，需给绝对路径，255字 符 内 格 式
			如:http://wap.tenpay.com/tenpay.jsp，确保威富通能通过互联网访问该地址
    	 * */
    	extra.put("notify_url", "http://www.ptgame888.cn/notifyurl");
    	/**商品标记，微信平台配置的商品标记，用于优惠券或者满减使用*/
        extra.put("goods_tag", "");
        /**商品id*/
        extra.put("product_id", "1818181818");
    	chargeMap.put("extra", extra);
    	
    	try {
    		//发起交易请求
    		charge = Charge.create(chargeMap);
    		// 传到客户端请先转成字符串 .toString(), 调该方法，会自动转成正确的 JSON 字符串
    		String chargeString = charge.toString();
    		System.out.println(chargeString);
    	} catch (KehanException e) {
    		e.printStackTrace();
    	}
    	return charge;
    }
    
    /**
     * 创建 Charge (统一小额支付，是基于微信，手机 qq，支付宝钱包客户端提供的支付服务功能)
     *
     * 创建 Charge 用户需要组装一个 map 对象作为参数传递给 Charge.create();
     * map 里面参数的具体说明请参考：https://.com/document/api#api-c-new
     * @return Charge
     */
    public Charge createCharge4unified_trade_micropay() {
    	
    	Charge charge = null;
    	Map<String, Object> chargeMap = new HashMap<String, Object>();
    	
    	Map<String, String> app = new HashMap<String, String>();
    	
    	/**由 Kehanpay 生成的支付对象 ID， 27 位字符串。*/
    	app.put("id", appId);
    	chargeMap.put("app", app);
    	
    	/**支付使用的第三方支付渠道。参考 支付渠道属性值 。*/
    	chargeMap.put("channel", "unified_trade_micropay");
    	
    	/**商户订单号 自定义*/
    	String orderNo = new Date().getTime() + Main.randomString(7);
    	//orderNo = "14903100142572l00v95";
    	/**商户订单号，适配每个渠道对此参数的要求，必须在商户系统内唯一。*/
    	chargeMap.put("order_no", orderNo);
    	
    	/**订单总金额（必须大于0），单位为对应币种的最小货币单位，人民币为分。如订单总金额为 1 元， amount 为 100，么么贷商户请查看申请的借贷金额范围。*/
    	chargeMap.put("amount", "5000");
    	
    	/**三位 ISO 货币代码，目前仅支持人民币  cny 。*/
    	chargeMap.put("currency", "cny");
    	
    	/**商品的标题，该参数最长为 32 个 字符*/
    	chargeMap.put("subject", "统一小额支付unified_trade_micropay测试");
    	
    	/**商品的描述信息，该参数最长为 128 个 字符*/
    	chargeMap.put("body", "body测试");
    	
    	/**发起支付请求客户端的 IP 地址，格式为 IPV4，如: 127.0.0.1*/ 
    	chargeMap.put("client_ip", "127.0.0.1");
    	
    	/**扫码支付授权码， 设备读取用户展示的条码或者二维码信息*/
    	chargeMap.put("auth_code", "130886708227563702");
    	
    	/**设备号【针对QQ钱包必填】*/
    	chargeMap.put("device_info", "aaaa1234567890");
    	
    	/**特定渠道发起交易时需要的额外参数，以及部分渠道支付成功返回的额外参数，详细参考 支付渠道 extra 参数说明 。*/
    	Map<String, Object> extra = new HashMap<String, Object>();
    	
    	/**商品标记，微信平台配置的商品标记，用于优惠券或者满减使用*/
        extra.put("goods_tag", "");
    	chargeMap.put("extra", extra);
    	try {
    		/**发起交易请求*/
    		charge = Charge.create(chargeMap);
    		/**传到客户端请先转成字符串 .toString(), 调该方法，会自动转成正确的 JSON 字符串*/ 
    		String chargeString = charge.toString();
    		System.out.println(chargeString);
    	} catch (KehanException e) {
    		System.out.println(e.getMessage());
    		e.printStackTrace();
    	}
    	return charge;
    }
    
    /**
     *  创建 Charge (支付宝扫码支付)
     *
     * 创建 Charge 用户需要组装一个 map 对象作为参数传递给 Charge.create();
     * map 里面参数的具体说明请参考：https://.com/document/api#api-c-new
     * @return Charge
     */
    public  Charge createCharge4alipay_qr() {
    	
    	Charge charge = null;
    	Map<String, Object> chargeMap = new HashMap<String, Object>();
    	
    	Map<String, String> app = new HashMap<String, String>();
    	
    	/**appId由kehanpay平台分配，对应商户对某个应用 ID*/
        app.put("id", appId);
        chargeMap.put("app", app);
        
        /**订单号 自定义商户订单号。*/
        String orderNo = new Date().getTime() + "";
        chargeMap.put("order_no", orderNo);
        
        /**支付使用的第三方支付渠道。参考 支付渠道属性值，alipay_qr为支付宝二维码支付 。*/
        chargeMap.put("channel", "alipay_qr");
        
        /**订单总金额（必须大于0），单位为对应币种的最小货币单位，人民币为：分。如订单总金额为 1元， amount 为 100。*/
        chargeMap.put("amount", "1");
        
        /**三位 ISO货币代码，目前仅支持人民币  cny 。*/
        chargeMap.put("currency", "cny");
        
        /**商品的标题，该参数最长为 32 个 Unicode 字符。*/
        chargeMap.put("subject", "商品的标题 支付宝扫码支付测试");
        
        /**商品的描述信息，该参数最长为 128 个 Unicode 字符。*/
        chargeMap.put("body", "商品的描述信息 支付宝扫码支付测试");
        
        /**发起支付请求客户端的 IP 地址，格式为 IPV4，如: 127.0.0.1*/
        chargeMap.put("client_ip", "127.0.0.1");
        
        /**
         * 订单失效时间，用Unix时间戳表示。时间范围在订单创建后的1分钟到15天，默认为1天，创建时间以支付服务器时间为准。
         * 微信对该参数的有效值限制为2小时内；银联对该参数的有效值限制为1小时内。格式为 yyyyMMddHHmmss，
         * 如2009 年 12 月 27 日 9 点 10 分 10 秒表示为20091227091010。时区为 GMT+8 beijing。
         * */
        //chargeMap.put("time_expire", "20170323042959");
        
        /**订单附加说明，最多 255 个 Unicode 字符。*/
        chargeMap.put("description", "订单附加说明");
        
        /**设备号	 终端设备号。*/
        chargeMap.put("device_info", "POS123456789");
        
        /**特定渠道发起交易时需要的额外参数，以及部分渠道支付成功返回的额外参数，详细参考 支付渠道 extra 参数说明 。*/
        Map<String, Object> extra = new HashMap<String, Object>();
        /**商品标记，微信平台配置的商品标记，用于优惠券或者满减使用*/
        extra.put("goods_tag", "");
        /**商品id*/
        extra.put("product_id", "1818181818");
        /**notify_url接收kehanpay通知的 URL，需给绝对路径，255字符内，格式
		       如:http://wap.tenpay.com/tenpay.jsp，确保支付平台能通过互联网访问该地址
         * */
        extra.put("notify_url", "http://wxpay.wxutil.com/notify.v2.php");
        chargeMap.put("extra", extra);
    	try {
    		//发起交易请求
    		charge = Charge.create(chargeMap);
    		// 传到客户端请先转成字符串 .toString(), 调该方法，会自动转成正确的 JSON 字符串
    		String chargeString = charge.toString();
    		System.out.println(chargeString);
    	} catch (KehanException e) {
    		e.printStackTrace();
    	}
    	return charge;
    }
    
    
    /**
     *  创建 Charge (QQ H5 支付)
     *
     * 创建 Charge 用户需要组装一个 map 对象作为参数传递给 Charge.create();
     * map 里面参数的具体说明请参考：https://.com/document/api#api-c-new
     * @return Charge
     */
    public  Charge createCharge4qqpay_wappay() {
    	Charge charge = null;
    	Map<String, Object> chargeMap = new HashMap<String, Object>();
    	
    	Map<String, String> app = new HashMap<String, String>();
    	
    	/*
        out_trade_no商户订单号(max长度32位)
        body商品描述 max长度127
        attach附加信息(长度128)
        total_fee总金额(单位：分 整型)
        mch_create_ip终端IP(长度16)
    	 */
    	//kehanpay分配商户号
    	app.put("id", appId);//由 Kehanpay 生成的支付对象 ID， 27 位字符串。
    	chargeMap.put("app", app);
    	chargeMap.put("channel", "qqpay_wappay");//支付使用的第三方支付渠道。参考 支付渠道属性值 。
    	String orderNo = new Date().getTime() + Main.randomString(7);//demo 订单号 自定义
    	//orderNo = "1481659695315re4as7j";
    	chargeMap.put("order_no", orderNo);//商户订单号，适配每个渠道对此参数的要求，必须在商户系统内唯一。( alipay : 1-64 位，  wx : 2-32 位， bfb : 1-20 位， upacp : 8-40 位， yeepay_wap :1-50 位， jdpay_wap :1-30 位， cnp_u :8-20 位， cnp_f :8-20 位， qpay :1-30 位， cmb_wallet :10 位纯数字字符串。注：除 cmb_wallet 外的其他渠道推荐使用 8-20 位，要求数字或字母，不允许特殊字符)。
    	chargeMap.put("amount", "1");//订单总金额（必须大于0），单位为对应币种的最小货币单位，人民币为分。如订单总金额为 1 元， amount 为 100，么么贷商户请查看申请的借贷金额范围。
    	chargeMap.put("currency", "cny");//三位 ISO 货币代码，目前仅支持人民币  cny 。
    	chargeMap.put("subject", "微信扫码支付wx_pub_qr测试");//商品的标题，该参数最长为 32 个 Unicode 字符，银联全渠道（ upacp / upacp_wap ）限制在 32 个字节。
    	chargeMap.put("body", "body退款测试");//商品的描述信息，该参数最长为 128 个 Unicode 字符，yeepay_wap 对于该参数长度限制为 100 个 Unicode 字符。
    	chargeMap.put("client_ip", "127.0.0.1");// 发起支付请求客户端的 IP 地址，格式为 IPV4，如: 127.0.0.1
    	chargeMap.put("auth_code", "910730690670569498");
    	/**notify_url
    	 * 接收kehanpay通知的 URL，需给绝对路径，255字 符 内 格 式
			如:http://wap.tenpay.com/tenpay.jsp，确保威富通能通过互联网访问该地址
    	 * */
    	chargeMap.put("notify_url", "http://www.ptgame888.cn/notifyurl");
    	chargeMap.put("callback_url", "http://wap.tenpay.com/callback.asp");
    	
    	Map<String, Object> extra = new HashMap<String, Object>();//特定渠道发起交易时需要的额外参数，以及部分渠道支付成功返回的额外参数，详细参考 支付渠道 extra 参数说明 。
    	
    	String products = "[{'name':'apple','quantity':'1','amount':'1','description':'苹果'}]";
    	extra.put("products", products);
    	chargeMap.put("extra", extra);
    	try {
    		//发起交易请求
    		charge = Charge.create(chargeMap);
    		// 传到客户端请先转成字符串 .toString(), 调该方法，会自动转成正确的 JSON 字符串
    		String chargeString = charge.toString();
    		System.out.println(chargeString);
    	} catch (KehanException e) {
    		e.printStackTrace();
    	}
    	return charge;
    }
    
    /**
     *  创建 Charge (QQ公众号支付)
     *
     * 创建 Charge 用户需要组装一个 map 对象作为参数传递给 Charge.create();
     * map 里面参数的具体说明请参考：https://.com/document/api#api-c-new
     * @return Charge
     */
    public  Charge createCharge4qqpay_jspay() {
    	Charge charge = null;
    	Map<String, Object> chargeMap = new HashMap<String, Object>();
    	
    	Map<String, String> app = new HashMap<String, String>();
    	
    	/*
        out_trade_no商户订单号(max长度32位)
        body商品描述 max长度127
        attach附加信息(长度128)
        total_fee总金额(单位：分 整型)
        mch_create_ip终端IP(长度16)
    	 */
    	//kehanpay分配商户号
    	app.put("id", appId);//由 Kehanpay 生成的支付对象 ID， 27 位字符串。
    	chargeMap.put("app", app);
    	chargeMap.put("channel", "qqpay_jspay");//支付使用的第三方支付渠道。参考 支付渠道属性值 。
    	String orderNo = new Date().getTime() + Main.randomString(7);//demo 订单号 自定义
    	//orderNo = "1481659695315re4as7j";
    	chargeMap.put("order_no", orderNo);//商户订单号，适配每个渠道对此参数的要求，必须在商户系统内唯一。( alipay : 1-64 位，  wx : 2-32 位， bfb : 1-20 位， upacp : 8-40 位， yeepay_wap :1-50 位， jdpay_wap :1-30 位， cnp_u :8-20 位， cnp_f :8-20 位， qpay :1-30 位， cmb_wallet :10 位纯数字字符串。注：除 cmb_wallet 外的其他渠道推荐使用 8-20 位，要求数字或字母，不允许特殊字符)。
    	chargeMap.put("amount", "1");//订单总金额（必须大于0），单位为对应币种的最小货币单位，人民币为分。如订单总金额为 1 元， amount 为 100，么么贷商户请查看申请的借贷金额范围。
    	chargeMap.put("currency", "cny");//三位 ISO 货币代码，目前仅支持人民币  cny 。
    	chargeMap.put("subject", "微信扫码支付qqpay_jspay测试");//商品的标题，该参数最长为 32 个 Unicode 字符，银联全渠道（ upacp / upacp_wap ）限制在 32 个字节。
    	chargeMap.put("body", "body退款测试");//商品的描述信息，该参数最长为 128 个 Unicode 字符，yeepay_wap 对于该参数长度限制为 100 个 Unicode 字符。
    	chargeMap.put("client_ip", "127.0.0.1");// 发起支付请求客户端的 IP 地址，格式为 IPV4，如: 127.0.0.1
    	
    	/**notify_url
    	 * 接收kehanpay通知的 URL，需给绝对路径，255字 符 内 格 式
			如:http://wap.tenpay.com/tenpay.jsp，确保威富通能通过互联网访问该地址
    	 * */
    	chargeMap.put("notify_url", "http://www.ptgame888.cn/notifyurl");
    	chargeMap.put("callback_url", "http://wap.tenpay.com/callback.asp");
    	
    	Map<String, Object> extra = new HashMap<String, Object>();//特定渠道发起交易时需要的额外参数，以及部分渠道支付成功返回的额外参数，详细参考 支付渠道 extra 参数说明 。
    	
    	String products = "[{'name':'apple','quantity':'1','amount':'1','description':'苹果'}]";
    	extra.put("products", products);
    	chargeMap.put("extra", extra);
    	try {
    		//发起交易请求
    		charge = Charge.create(chargeMap);
    		// 传到客户端请先转成字符串 .toString(), 调该方法，会自动转成正确的 JSON 字符串
    		String chargeString = charge.toString();
    		System.out.println(chargeString);
    	} catch (KehanException e) {
    		e.printStackTrace();
    	}
    	return charge;
    }
    /**
     *  创建 Charge (手QQ扫码支付)
     *
     * 创建 Charge 用户需要组装一个 map 对象作为参数传递给 Charge.create();
     * map 里面参数的具体说明请参考：https://.com/document/api#api-c-new
     * @return Charge
     */
    public  Charge createCharge4qqpay_qr() {
    	Charge charge = null;
    	Map<String, Object> chargeMap = new HashMap<String, Object>();
    	
    	Map<String, String> app = new HashMap<String, String>();
    	
    	/*
        out_trade_no商户订单号(max长度32位)
        body商品描述 max长度127
        attach附加信息(长度128)
        total_fee总金额(单位：分 整型)
        mch_create_ip终端IP(长度16)
    	 */
    	//kehanpay分配商户号
    	app.put("id", appId);//由 Kehanpay 生成的支付对象 ID， 27 位字符串。
    	chargeMap.put("app", app);
    	chargeMap.put("channel", "qqpay_qr");//支付使用的第三方支付渠道。参考 支付渠道属性值 。
//        chargeMap.put("channel", "CNCB_PAY_WEIXIN_NATIVE");//支付使用的第三方支付渠道。参考 支付渠道属性值 。
    	String orderNo = new Date().getTime() + Main.randomString(7);//demo 订单号 自定义
    	//orderNo = "1481659695315re4as7j";
    	chargeMap.put("order_no", orderNo);//商户订单号，适配每个渠道对此参数的要求，必须在商户系统内唯一。( alipay : 1-64 位，  wx : 2-32 位， bfb : 1-20 位， upacp : 8-40 位， yeepay_wap :1-50 位， jdpay_wap :1-30 位， cnp_u :8-20 位， cnp_f :8-20 位， qpay :1-30 位， cmb_wallet :10 位纯数字字符串。注：除 cmb_wallet 外的其他渠道推荐使用 8-20 位，要求数字或字母，不允许特殊字符)。
    	chargeMap.put("amount", "1");//订单总金额（必须大于0），单位为对应币种的最小货币单位，人民币为分。如订单总金额为 1 元， amount 为 100，么么贷商户请查看申请的借贷金额范围。
    	chargeMap.put("currency", "cny");//三位 ISO 货币代码，目前仅支持人民币  cny 。
    	chargeMap.put("subject", "微信扫码支付wx_pub_qr测试");//商品的标题，该参数最长为 32 个 Unicode 字符，银联全渠道（ upacp / upacp_wap ）限制在 32 个字节。
    	chargeMap.put("body", "body退款测试");//商品的描述信息，该参数最长为 128 个 Unicode 字符，yeepay_wap 对于该参数长度限制为 100 个 Unicode 字符。
    	chargeMap.put("client_ip", "127.0.0.1");// 发起支付请求客户端的 IP 地址，格式为 IPV4，如: 127.0.0.1
    	
    	/**notify_url
    	 * 接收kehanpay通知的 URL，需给绝对路径，255字 符 内 格 式
			如:http://wap.tenpay.com/tenpay.jsp，确保威富通能通过互联网访问该地址
    	 * */
    	chargeMap.put("notify_url", "http://www.ptgame888.cn/notifyurl");
    	
    	Map<String, Object> extra = new HashMap<String, Object>();//特定渠道发起交易时需要的额外参数，以及部分渠道支付成功返回的额外参数，详细参考 支付渠道 extra 参数说明 。
    	
    	String products = "[{'name':'apple','quantity':'1','amount':'1','description':'苹果'}]";
    	extra.put("products", products);
    	chargeMap.put("extra", extra);
    	try {
    		//发起交易请求
    		charge = Charge.create(chargeMap);
    		// 传到客户端请先转成字符串 .toString(), 调该方法，会自动转成正确的 JSON 字符串
    		String chargeString = charge.toString();
    		System.out.println(chargeString);
    	} catch (KehanException e) {
    		e.printStackTrace();
    	}
    	return charge;
    }
    
    /**
     *  创建 Charge (微信app支付)
     *
     * 创建 Charge 用户需要组装一个 map 对象作为参数传递给 Charge.create();
     * map 里面参数的具体说明请参考：https://.com/document/api#api-c-new
     * @return Charge
     */
    public  Charge createCharge4wx_app() {
    	Charge charge = null;
    	Map<String, Object> chargeMap = new HashMap<String, Object>();
    	
    	Map<String, String> app = new HashMap<String, String>();
    	
    	/**appId由kehanpay平台分配，对应商户对某个应用 ID*/
        app.put("id", appId);
        chargeMap.put("app", app);
        
        /**订单号 自定义商户订单号。*/
        String orderNo = new Date().getTime() + Main.randomString(7);
        chargeMap.put("order_no", orderNo);
        
        /**支付使用的第三方支付渠道。参考 支付渠道属性值，wx为微信app支付 。*/
        chargeMap.put("channel", "wx");
        
        /**订单总金额（必须大于0），单位为对应币种的最小货币单位，人民币为：分。如订单总金额为 1元， amount 为 100。*/
        chargeMap.put("amount", "1");
        
        /**三位 ISO货币代码，目前仅支持人民币  cny 。*/
        chargeMap.put("currency", "cny");
        
        /**商品的标题，该参数最长为 32 个 Unicode 字符。*/
        chargeMap.put("subject", "商品的标题 微信app支付测试");
        
        /**商品的描述信息，该参数最长为 128 个 Unicode 字符。*/
        chargeMap.put("body", "商品的描述信息 微信app支付测试");
        
        /**发起支付请求客户端的 IP 地址，格式为 IPV4，如: 127.0.0.1*/
        chargeMap.put("client_ip", "127.0.0.1");
        
        /**
         * 订单失效时间，用Unix时间戳表示。时间范围在订单创建后的1分钟到15天，默认为1天，创建时间以支付服务器时间为准。
         * 微信对该参数的有效值限制为2小时内；银联对该参数的有效值限制为1小时内。格式为 yyyyMMddHHmmss，
         * 如2009 年 12 月 27 日 9 点 10 分 10 秒表示为20091227091010。时区为 GMT+8 beijing。
         * */
        chargeMap.put("time_expire", "");
        
        /**订单附加说明，最多 255 个 Unicode 字符。*/
        chargeMap.put("description", "订单附加说明");
    	
    	/**特定渠道发起交易时需要的额外参数，以及部分渠道支付成功返回的额外参数，详细参考 支付渠道 extra 参数说明 。*/
        Map<String, Object> extra = new HashMap<String, Object>();
        /**notify_url接收kehanpay通知的 URL，需给绝对路径，255字符内，格式
		       如:http://wap.tenpay.com/tenpay.jsp，确保支付平台能通过互联网访问该地址
         * */
        extra.put("notify_url", "http://wxpay.wxutil.com/notify.v2.php");
        /**商品标记，微信平台配置的商品标记，用于优惠券或者满减使用*/
        extra.put("goods_tag", "");
        /**指定支付方式，指定不能使用信用卡支付可设置为 no_credit*/
        extra.put("limitPay", "");
        chargeMap.put("extra", extra);
    	
    	try {
    		//发起交易请求
    		charge = Charge.create(chargeMap);
    		// 传到客户端请先转成字符串 .toString(), 调该方法，会自动转成正确的 JSON 字符串
    		String chargeString = charge.toString();
    		System.out.println(chargeString);
    	} catch (KehanException e) {
    		e.printStackTrace();
    	}
    	return charge;
    }
    
    /**
     *  创建 Charge (天津农商行支付宝扫码支付)
     *
     * 创建 Charge 用户需要组装一个 map 对象作为参数传递给 Charge.create();
     * map 里面参数的具体说明请参考：https://.com/document/api#api-c-new
     * @return Charge
     */
    public  Charge createCharge4trc_alipay_qr() {
    	Charge charge = null;
    	Map<String, Object> chargeMap = new HashMap<String, Object>();
    	
    	Map<String, String> app = new HashMap<String, String>();
    	
    	/*
        out_trade_no商户订单号(max长度32位)
        body商品描述 max长度127
        attach附加信息(长度128)
        total_fee总金额(单位：分 整型)
        mch_create_ip终端IP(长度16)
    	 */
    	//appId为kehanpay 管理平台商户对应的应用 ID
    	app.put("id", appId);
    	chargeMap.put("app", app);
    	
    	//支付使用的第三方支付渠道。参考 支付渠道属性值，wx_pub_qr为微信二维码支付 。
    	chargeMap.put("channel", "wx_pub_qr");
    	
    	//demo 订单号 自定义商户订单号。
    	String orderNo = new Date().getTime() + Main.randomString(7);
    	//orderNo = "1481659695315re4as7j";//--测试重复下单情况
    	chargeMap.put("order_no", orderNo);
    	
    	//订单总金额（必须大于0），单位为对应币种的最小货币单位，人民币为分。如订单总金额为 1 元， amount 为 100。
    	chargeMap.put("amount", "510");
    	
    	//三位 ISO 货币代码，目前仅支持人民币  cny 。
    	chargeMap.put("currency", "cny");
    	
    	//商品的标题，该参数最长为 32 个 Unicode 字符。
    	chargeMap.put("subject", "subject微信扫码支付wx_pub_qr测试");
    	
    	//商品的描述信息，该参数最长为 128 个 Unicode 字符。
    	chargeMap.put("body", "body微信扫码支付wx_pub_qr测试");
    	
    	//发起支付请求客户端的 IP 地址，格式为 IPV4，如: 127.0.0.1
    	chargeMap.put("client_ip", "127.0.0.1");
    	
    	/**notify_url
    	 * 接收kehanpay通知的 URL，需给绝对路径，255字 符 内 格 式
			如:http://wap.tenpay.com/tenpay.jsp，确保威富通能通过互联网访问该地址
    	 * */
    	chargeMap.put("notify_url", "http://www.ptgame888.cn/notifyurl");
    	
    	//特定渠道发起交易时需要的额外参数，以及部分渠道支付成功返回的额外参数，详细参考 支付渠道 extra 参数说明 。
    	Map<String, Object> extra = new HashMap<String, Object>();
    	String products = "[{'name':'apple','quantity':'1','amount':'1','description':'苹果'}]";
    	extra.put("products", products);
    	chargeMap.put("extra", extra);
    	
    	try {
    		//发起交易请求
    		charge = Charge.create(chargeMap);
    		// 传到客户端请先转成字符串 .toString(), 调该方法，会自动转成正确的 JSON 字符串
    		String chargeString = charge.toString();
    		System.out.println(chargeString);
    	} catch (KehanException e) {
    		e.printStackTrace();
    	}
    	return charge;
    }
    
    /**
     *  创建 Charge (天津农商行微信扫码支付)
     *
     * 创建 Charge 用户需要组装一个 map 对象作为参数传递给 Charge.create();
     * map 里面参数的具体说明请参考：https://.com/document/api#api-c-new
     * @return Charge
     */
    public  Charge createCharge4trc_wx_pub_qr() {
    	Charge charge = null;
    	Map<String, Object> chargeMap = new HashMap<String, Object>();
    	
    	Map<String, String> app = new HashMap<String, String>();
    	
    	/*
        out_trade_no商户订单号(max长度32位)
        body商品描述 max长度127
        attach附加信息(长度128)
        total_fee总金额(单位：分 整型)
        mch_create_ip终端IP(长度16)
    	 */
    	//appId为kehanpay 管理平台商户对应的应用 ID
    	app.put("id", appId);
    	chargeMap.put("app", app);
    	
    	//支付使用的第三方支付渠道。参考 支付渠道属性值，wx_pub_qr为微信二维码支付 。
    	chargeMap.put("channel", "wx_pub_qr");
    	
    	//demo 订单号 自定义商户订单号。
    	String orderNo = new Date().getTime() + Main.randomString(7);
    	//orderNo = "1481659695315re4as7j";//--测试重复下单情况
    	chargeMap.put("order_no", orderNo);
    	
    	//订单总金额（必须大于0），单位为对应币种的最小货币单位，人民币为分。如订单总金额为 1 元， amount 为 100。
    	chargeMap.put("amount", "510");
    	
    	//三位 ISO 货币代码，目前仅支持人民币  cny 。
    	chargeMap.put("currency", "cny");
    	
    	//商品的标题，该参数最长为 32 个 Unicode 字符。
    	chargeMap.put("subject", "subject微信扫码支付wx_pub_qr测试");
    	
    	//商品的描述信息，该参数最长为 128 个 Unicode 字符。
    	chargeMap.put("body", "body微信扫码支付wx_pub_qr测试");
    	
    	//发起支付请求客户端的 IP 地址，格式为 IPV4，如: 127.0.0.1
    	chargeMap.put("client_ip", "127.0.0.1");
    	
    	/**notify_url
    	 * 接收kehanpay通知的 URL，需给绝对路径，255字 符 内 格 式
			如:http://wap.tenpay.com/tenpay.jsp，确保威富通能通过互联网访问该地址
    	 * */
    	chargeMap.put("notify_url", "http://www.ptgame888.cn/notifyurl");
    	
    	//特定渠道发起交易时需要的额外参数，以及部分渠道支付成功返回的额外参数，详细参考 支付渠道 extra 参数说明 。
    	Map<String, Object> extra = new HashMap<String, Object>();
    	String products = "[{'name':'apple','quantity':'1','amount':'1','description':'苹果'}]";
    	extra.put("products", products);
    	chargeMap.put("extra", extra);
    	
    	try {
    		//发起交易请求
    		charge = Charge.create(chargeMap);
    		// 传到客户端请先转成字符串 .toString(), 调该方法，会自动转成正确的 JSON 字符串
    		String chargeString = charge.toString();
    		System.out.println(chargeString);
    	} catch (KehanException e) {
    		e.printStackTrace();
    	}
    	return charge;
    }
    
    /**
     *  创建 Charge (微信扫码支付)
     *
     * 创建 Charge 用户需要组装一个 map 对象作为参数传递给 Charge.create();
     * map 里面参数的具体说明请参考：https://.com/document/api#api-c-new
     * @return Charge
     */
    public  Charge createCharge4wx_pub_qr() {
        Charge charge = null;
        Map<String, Object> chargeMap = new HashMap<String, Object>();
        Map<String, String> app = new HashMap<String, String>();
        
        /**appId由kehanpay平台分配，对应商户对某个应用 ID*/
        app.put("id", appId);
        chargeMap.put("app", app);
        
        /**订单号 自定义商户订单号。*/
        String orderNo = new Date().getTime() + Main.randomString(7);
        chargeMap.put("order_no", orderNo);
        
        /**支付使用的第三方支付渠道。参考 支付渠道属性值，wx_pub_qr为微信二维码支付 。*/
        chargeMap.put("channel", "wx_pub_qr");
        
        /**订单总金额（必须大于0），单位为对应币种的最小货币单位，人民币为：分。如订单总金额为 1元， amount 为 100。*/
        chargeMap.put("amount", "1");
        
        /**三位 ISO货币代码，目前仅支持人民币  cny 。*/
        chargeMap.put("currency", "cny");
        
        /**商品的标题，该参数最长为 32 个 Unicode 字符。*/
        chargeMap.put("subject", "商品的标题 微信扫码支付测试");
        
        /**商品的描述信息，该参数最长为 128 个 Unicode 字符。*/
        chargeMap.put("body", "商品的描述信息 微信扫码支付测试");
        
        /**发起支付请求客户端的 IP 地址，格式为 IPV4，如: 127.0.0.1*/
        chargeMap.put("client_ip", "127.0.0.1");
        
        /**
         * 订单失效时间，用Unix时间戳表示。时间范围在订单创建后的1分钟到15天，默认为1天，创建时间以支付服务器时间为准。
         * 微信对该参数的有效值限制为2小时内；银联对该参数的有效值限制为1小时内。格式为 yyyyMMddHHmmss，
         * 如2009 年 12 月 27 日 9 点 10 分 10 秒表示为20091227091010。时区为 GMT+8 beijing。
         * */
        //chargeMap.put("time_expire", "20170323023059");
        
        /**订单附加说明，最多 255 个 Unicode 字符。*/
        chargeMap.put("description", "订单附加说明");
        
        /**特定渠道发起交易时需要的额外参数，以及部分渠道支付成功返回的额外参数，详细参考 支付渠道 extra 参数说明 。*/
        Map<String, Object> extra = new HashMap<String, Object>();
        /**商品标记，微信平台配置的商品标记，用于优惠券或者满减使用*/
        extra.put("goods_tag", "");
        /**指定支付方式，指定不能使用信用卡支付可设置为 no_credit*/
        extra.put("limitPay", "no_credit");
        /**商品id*/
        extra.put("product_id", "1818181818");
        /**notify_url接收kehanpay通知的 URL，需给绝对路径，255字符内，格式
		       如:http://wap.tenpay.com/tenpay.jsp，确保支付平台能通过互联网访问该地址
         * */
        extra.put("notify_url", "http://wxpay.wxutil.com/notify.v2.php");
        chargeMap.put("extra", extra);
        
        try {
            //发起交易请求
            charge = Charge.create(chargeMap);
            // 传到客户端请先转成字符串 .toString(), 调该方法，会自动转成正确的 JSON 字符串
            String chargeString = charge.toString();
            System.out.println(chargeString);
        } catch (KehanException e) {
            e.printStackTrace();
        }
        return charge;
    }

    /**
     * 创建 Charge
     *
     * 创建 Charge 用户需要组装一个 map 对象作为参数传递给 Charge.create();
     * map 里面参数的具体说明请参考：https://.com/document/api#api-c-new
     * @return Charge
     */
    public Charge createCharge() {
        Charge charge = null;
        Map<String, Object> chargeMap = new HashMap<String, Object>();
        chargeMap.put("amount", 100);//订单总金额, 人民币单位：分（如订单总金额为 1 元，此处请填 100）
        chargeMap.put("currency", "cny");
        chargeMap.put("subject", "Your Subject");
        chargeMap.put("body", "Your Body");
        String orderNo = new Date().getTime() + Main.randomString(7);
        chargeMap.put("order_no", orderNo);// 推荐使用 8-20 位，要求数字或字母，不允许其他字符
        chargeMap.put("channel", "alipay");// 支付使用的第三方支付渠道取值，请参考：https://www..com/api#api-c-new
        chargeMap.put("client_ip", "127.0.0.1"); // 发起支付请求客户端的 IP 地址，格式为 IPV4，如: 127.0.0.1
        Map<String, String> app = new HashMap<String, String>();
        app.put("id", appId);
        chargeMap.put("app", app);

        Map<String, Object> extra = new HashMap<String, Object>();
//        extra.put("open_id", "USER_OPENID");
        //chargeMap.put("extra", extra);
        try {
            //发起交易请求
            charge = Charge.create(chargeMap);
            // 传到客户端请先转成字符串 .toString(), 调该方法，会自动转成正确的 JSON 字符串
            String chargeString = charge.toString();
        } catch (KehanException e) {
            e.printStackTrace();
        }
        return charge;
    }

    /**
     * 创建 Charge (微信公众号支付)
     *
     * 创建 Charge 用户需要组装一个 map 对象作为参数传递给 Charge.create();
     * map 里面参数的具体说明请参考：https://.com/document/api#api-c-new
     * @return Charge
     */
    public Charge createChargeWithOpenid(String openid) {
        Charge charge = null;
        Map<String, Object> chargeMap = new HashMap<String, Object>();
        Map<String, String> app = new HashMap<String, String>();
        
        /**appId由kehanpay平台分配，对应商户对某个应用 ID*/
        app.put("id", appId);
        chargeMap.put("app", app);
        /**订单号 自定义商户订单号。*/
        String orderNo = new Date().getTime() + Main.randomString(7);
        chargeMap.put("order_no", orderNo);
        
        /**支付使用的第三方支付渠道。参考 支付渠道属性值，wx_pub为微信公众号支付 。*/
        chargeMap.put("channel", "wx_pub");
        
        /**订单总金额（必须大于0），单位为对应币种的最小货币单位，人民币为：分。如订单总金额为 1元， amount 为 100。*/
        chargeMap.put("amount", "1");
        
        /**三位 ISO货币代码，目前仅支持人民币  cny 。*/
        chargeMap.put("currency", "cny");
        
        /**商品的标题，该参数最长为 32 个 Unicode 字符。*/
        chargeMap.put("subject", "商品的标题 微信公众号支付测试");
        
        /**商品的描述信息，该参数最长为 128 个 Unicode 字符。*/
        chargeMap.put("body", "商品的描述信息 微信公众号支付测试");
        
        /**发起支付请求客户端的 IP 地址，格式为 IPV4，如: 127.0.0.1*/
        chargeMap.put("client_ip", "127.0.0.1");
        
        /**
         * 订单失效时间，用Unix时间戳表示。时间范围在订单创建后的1分钟到15天，默认为1天，创建时间以支付服务器时间为准。
         * 微信对该参数的有效值限制为2小时内；银联对该参数的有效值限制为1小时内。格式为 yyyyMMddHHmmss，
         * 如2009 年 12 月 27 日 9 点 10 分 10 秒表示为20091227091010。时区为 GMT+8 beijing。
         * */
        //chargeMap.put("time_expire", "20170323035659");
        
        /**订单附加说明，最多 255 个 Unicode 字符。*/
        chargeMap.put("description", "");

        Map<String, Object> extra = new HashMap<String, Object>();
        extra.put("open_id", openid);// 用户在商户微信公众号下的唯一标识，获取方式可参考 WxPubOAuthExample.java
        /**notify_url
         * 接收kehanpay通知的 URL，需给绝对路径，255字 符 内 格 式
			如:http://wap.tenpay.com/tenpay.jsp，确保kehanpay能通过互联网访问该地址
         * */
        extra.put("notify_url", "http://wap.tenpay.com/tenpay.jsp");
        /**
         * 交易完成后跳转的 URL，需给绝对路径，255字 符 内 格 式
			如:http://wap.tenpay.com/callback.asp
			注:该地址只作为前端页面的一个跳转，需使用 notify_url 通知结果作为支付最终结果
         */
        extra.put("callback_url", "http://wap.tenpay.com/callback.asp");
        /**指定支付方式，指定不能使用信用卡支付可设置为 no_credit*/
        extra.put("limitPay", "no_credit");
        chargeMap.put("extra", extra);
        try {
            //发起交易请求
            charge = Charge.create(chargeMap);
            // 传到客户端请先转成字符串 .toString(), 调该方法，会自动转成正确的 JSON 字符串
            String chargeString = charge.toString();
            System.out.println(chargeString);
        } catch (KehanException e) {
            e.printStackTrace();
        }
        return charge;
    }

    /**
     * 查询 Charge
     *
     * 该接口根据 charge Id 查询对应的 charge 。
     * 参考文档：https://.com/document/api#api-c-inquiry
     *
     * 该接口可以传递一个 expand ， 返回的 charge 中的 app 会变成 app 对象。
     * 参考文档： https://.com/document/api#api-expanding
     * @param id
     */
    public Charge retrieve(String id) {
        Charge charge = null;
        try {
            Map<String, Object> params = new HashMap<String, Object>();
            
            params.put("aaa", 123456);
            params.put("bbb", 123456);
            params.put("ccc", 123456);
            
            charge = Charge.retrieve(id, params);
            System.out.println(charge);
        } catch (KehanException e) {
            e.printStackTrace();
        }

        return charge;
    }
    
    /**
     * 查询 Charge
     *
     * 该接口根据 商户当前应用的appId和商户订单号 查询对应的 charge 。
     * 参考文档：https://.com/document/api#api-c-inquiry
     *
     * 该接口可以传递一个 expand ， 返回的 charge 中的 app 会变成 app 对象。
     * 参考文档： https://.com/document/api#api-expanding
     * @param id
     */
    public Charge retrieve(String appId,String mch_order_no) {
    	Charge charge = null;
    	try {
    		Map<String, Object> params = new HashMap<String, Object>();
    		
    		params.put("aaa", 123456);
    		params.put("bbb", 123456);
    		params.put("ccc", 123456);
    		
    		charge = Charge.retrieve(appId,mch_order_no, params);
    		System.out.println(charge);
    	} catch (KehanException e) {
    		e.printStackTrace();
    	}
    	
    	return charge;
    }

    /**
     * 分页查询 Charge
     *
     * 该接口为批量查询接口，默认一次查询10条。
     * 用户可以通过添加 limit 参数自行设置查询数目，最多一次不能超过 100 条。
     *
     * 该接口同样可以使用 expand 参数。
     * @return chargeCollection
     */
    public ChargeCollection all() {
        ChargeCollection chargeCollection = null;
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("limit", 10);
        Map<String, String> app = new HashMap<String, String>();
        app.put("id", appId);
        params.put("app", app);

        try {
            chargeCollection = Charge.all(params);
            System.out.println(chargeCollection);
        } catch (AuthenticationException e) {
            e.printStackTrace();
        } catch (InvalidRequestException e) {
            e.printStackTrace();
        } catch (APIConnectionException e) {
            e.printStackTrace();
        } catch (APIException e) {
            e.printStackTrace();
        } catch (ChannelException e) {
			e.printStackTrace();
		}

        return chargeCollection;
    }
}
